package com.chushouya.product.rabbitmq;

import com.chushouya.product.rabbitmq.sender.ResolveEvaluateMessageSender;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * 商品评估解析消息使用示例
 * 
 * 本示例展示了如何使用ResolveEvaluateMessageSender发送商品评估解析消息
 * 消息将被ResolveEvaluateMessageListener监听并处理，调用ResolveEvaluateApiService.resolveEvaluateItem方法
 * 
 * @author chushouya
 */
public class ResolveEvaluateMessageUsageExample {

    @Resource
    private ResolveEvaluateMessageSender resolveEvaluateMessageSender;

    /**
     * 示例1：立即发送商品评估解析消息
     * 适用场景：商品创建后立即解析评估项
     */
    public void example1_SendImmediateMessage() {
        Long productId = 123456L;
        
        // 立即发送消息
        resolveEvaluateMessageSender.sendResolveEvaluateMessage(productId);
    }

    /**
     * 示例2：延时发送商品评估解析消息（秒）
     * 适用场景：商品信息更新后，延迟一段时间再解析评估项
     */
    public void example2_SendDelayedMessageInSeconds() {
        Long productId = 123456L;
        int delaySeconds = 30; // 延时30秒
        
        // 延时发送消息
        resolveEvaluateMessageSender.sendResolveEvaluateMessage(productId, delaySeconds);
    }

    /**
     * 示例3：延时发送商品评估解析消息（分钟）
     * 适用场景：商品审核通过后，延迟几分钟再解析评估项
     */
    public void example3_SendDelayedMessageInMinutes() {
        Long productId = 123456L;
        int delayMinutes = 5; // 延时5分钟
        
        // 延时发送消息
        resolveEvaluateMessageSender.sendResolveEvaluateMessageDelayMinutes(productId, delayMinutes);
    }

    /**
     * 示例4：发送带类型的商品评估解析消息
     * 适用场景：需要区分不同类型的解析任务
     */
    public void example4_SendTypedMessage() {
        Long productId = 123456L;
        String messageType = "PRODUCT_CREATE"; // 商品创建类型
        
        // 发送带类型的消息
        resolveEvaluateMessageSender.sendResolveEvaluateMessage(productId, messageType);
    }

    /**
     * 示例5：发送带类型的延时消息
     * 适用场景：需要延时处理且区分类型的解析任务
     */
    public void example5_SendTypedDelayedMessage() {
        Long productId = 123456L;
        String messageType = "PRODUCT_UPDATE"; // 商品更新类型
        long delay = 2;
        TimeUnit timeUnit = TimeUnit.MINUTES;
        
        // 发送带类型的延时消息
        resolveEvaluateMessageSender.sendResolveEvaluateMessage(productId, messageType, delay, timeUnit);
    }

    /**
     * 示例6：发送重试消息
     * 适用场景：解析失败后需要重试
     */
    public void example6_SendRetryMessage() {
        Long productId = 123456L;
        int retryCount = 1; // 第1次重试
        
        // 发送重试消息（会自动计算延时时间：30秒 * retryCount）
        resolveEvaluateMessageSender.sendResolveEvaluateRetryMessage(productId, retryCount);
        
        // 第2次重试（延时60秒）
        // resolveEvaluateMessageSender.sendResolveEvaluateRetryMessage(productId, 2);
        
        // 第3次重试（延时120秒）
        // resolveEvaluateMessageSender.sendResolveEvaluateRetryMessage(productId, 3);
    }

    /**
     * 示例7：批量发送商品评估解析消息
     * 适用场景：需要批量处理多个商品的评估解析
     */
    public void example7_SendBatchMessages() {
        Long[] productIds = {123456L, 123457L, 123458L, 123459L, 123460L};
        
        // 批量发送消息（每个消息间隔2秒）
        resolveEvaluateMessageSender.sendResolveEvaluateMessageBatch(productIds);
    }

    /**
     * 示例8：在商品创建服务中使用
     * 适用场景：商品创建完成后，自动触发评估解析
     */
    public void example8_UseInProductCreateService() {
        // 假设这是商品创建服务的方法
        Long productId = createProduct();
        
        // 商品创建成功后，发送评估解析消息
        if (productId != null) {
            // 延迟5秒发送，确保商品数据已完全保存
            resolveEvaluateMessageSender.sendResolveEvaluateMessage(productId, 5);
        }
    }

    /**
     * 示例9：在商品更新服务中使用
     * 适用场景：商品信息更新后，重新解析评估项
     */
    public void example9_UseInProductUpdateService() {
        Long productId = 123456L;
        
        // 更新商品信息
        updateProduct(productId);
        
        // 更新成功后，发送评估解析消息
        resolveEvaluateMessageSender.sendResolveEvaluateMessage(productId, "PRODUCT_UPDATE");
    }

    /**
     * 示例10：在定时任务中使用
     * 适用场景：定时批量处理商品评估解析
     */
    public void example10_UseInScheduledTask() {
        // 查询需要解析的商品ID列表
        Long[] productIds = queryProductsNeedResolve();
        
        if (productIds != null && productIds.length > 0) {
            // 批量发送消息
            resolveEvaluateMessageSender.sendResolveEvaluateMessageBatch(productIds);
        }
    }

    // ========== 模拟方法 ==========
    
    private Long createProduct() {
        // 模拟创建商品
        return 123456L;
    }
    
    private void updateProduct(Long productId) {
        // 模拟更新商品
    }
    
    private Long[] queryProductsNeedResolve() {
        // 模拟查询需要解析的商品
        return new Long[]{123456L, 123457L, 123458L};
    }
}
